/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AplicacionMVC;

import funciones.DatosServidor;
import funciones.SendMail;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;

/**
 *
 * @author Administrador
 */
public class HebraTratamiento extends Thread{
    static ArrayList<String> listadoHebras=new ArrayList<String>();
    
    private DatosServidor serv;
    private String email;
    private String inicio;
    private String fin;
    private int freq;
    private String texto;
    private String foto;
      
    HebraTratamiento(DatosServidor serv, String email, String inicio, String fin, int freq, String texto){
       this.serv=serv;
       this.email=email;
       this.inicio=inicio;
       this.fin=fin;
       this.freq=freq;
       this.texto=texto;
       listadoHebras.add(email+inicio+fin+freq+texto); // si no existe se añade al listado
    }
    
    HebraTratamiento(DatosServidor serv, String email, String inicio, String fin, int freq, String texto, String foto){
       this.serv=serv;
       this.email=email;
       this.inicio=inicio;
       this.fin=fin;
       this.freq=freq;
       this.texto=texto;
       this.foto=foto;
       listadoHebras.add(email+inicio+fin+freq+texto); // si no existe se añade al listado
    }
    
    @Override
    public void run(){
        System.out.println("Hebras tratamiento que están lanzadas: " +listadoHebras +"\n"); // DEBUG POR CONSOLA
        
        Calendar calendario = Calendar.getInstance();
        String fechaActual = calendario.get(Calendar.DAY_OF_MONTH) + "/" + (calendario.get(Calendar.MONTH)+1) + "/" + calendario.get(Calendar.YEAR);
        String horaActual = calendario.get(Calendar.HOUR_OF_DAY) + ":" + calendario.get(Calendar.MINUTE) + calendario.get(Calendar.SECOND);
        SendMail mail = new SendMail(); // CONFIGURACION DEL CORREO
        mail.setMail(serv.getUser());
        mail.setPassword(serv.getPass());
        mail.setSmtp(serv.getSmtp());
        mail.setPort(serv.getPort());

        if (freq==0){ // si el tratamiento no tiene frecuencia solo se envia un mail y se duerme
            try {
                 System.out.println(this.getName()+" "+horaActual+" >>>"+texto+"\n");
                 mail.setTextoMensaje("RECUERDE "+texto);
                if (foto!= null){
                    URL rutaURL = getClass().getResource(foto);  // conversion URL - URI
                    URI rutaURI = new URI(rutaURL.toString());
                    File file = new File(rutaURI);               // creacion de objt FILE
                    mail.setFicheroAdjunto(file);               // se adjunta el fichero al e-mail
                }
                 mail.enviarMail(serv.getEmaildestino(), "Sistema de avisos médicos automáticos");
                 // en realidad debería mandarse a:
                 //mail.enviarMail(email, "Sistema de avisos médicos automáticos");
                 Thread.sleep(24*60*60*1000);
            } catch (URISyntaxException ex) {
                Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {
                Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
            } catch (MessagingException ex) {
                    Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
                }
        }else{ // si no, se envía el mismo e-mail según la frecuencia
            try {
                mail.setTextoMensaje("LE TOCA TOMAR: "+texto);
                if (foto!= null){
                    URL rutaURL = getClass().getResource(foto);  // conversion URL - URI
                    URI rutaURI = new URI(rutaURL.toString());
                    File file = new File(rutaURI);               // creacion de objt FILE
                    mail.setFicheroAdjunto(file);
                }
                while(compararFechas(fechaActual, fin)!=1){ // mientras la fecha actual sea <= la fecha final
                    try {
                        System.out.println(this.getName()+" "+horaActual+" >>>"+texto+"\n");
                        mail.enviarMail(serv.getEmaildestino(), "Sistema de avisos médicos automáticos");
                        // en realidad debería mandarse a:
                        //mail.enviarMail(email, "Sistema de avisos médicos automáticos");
                        Thread.sleep(freq*60*1000); // se duerme hasta que le toque de nuevo
                    } catch (InterruptedException ex) {
                        Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
            } catch (URISyntaxException ex) {
                Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
            } catch (MessagingException ex) {
                Logger.getLogger(HebraTratamiento.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        listadoHebras.remove(email+inicio+fin+freq+texto); // se elimina la hebra del listado cuando finaliza
    }
    
   public int compararFechas(String actual, String fin){ 
        // compara fecha fin y fecha actual de la forma dd/mm/yyyy
        // devuelve:
        //  -1 si fin > actual
        //  1 si fin < actual
        //  0 si son =
	StringTokenizer tokens=new StringTokenizer(actual, "/");
 
        int acDia = (new Integer(tokens.nextToken()));
        int acMes = (new Integer(tokens.nextToken()));
        int acAnio= (new Integer(tokens.nextToken()));
        
        tokens=new StringTokenizer(fin, "/");

        int fiDia = (new Integer(tokens.nextToken()));
        int fiMes = (new Integer(tokens.nextToken()));
        int fiAnio= (new Integer(tokens.nextToken()));
        
        if(fiAnio > acAnio){
            return -1;
        }else if(fiAnio < acAnio){
            return 1;
        }else{
            if(fiMes > acMes){
                return -1;
            }else if(fiMes< acMes){
                return 1;
            }else{
                if(fiDia> acDia){
                    return -1;
                }else if(fiDia< acDia){
                    return 1;
                }else{
                    return 0;
                }
            }
        }   
    }   
}